// package关键字：声明当前类所在的包（文件夹）
// com.itheima.abstract2：包名，与Animal、Cat、Dog类在同一个包中
// 包的作用是组织代码，避免类名冲突
package com.itheima.abstract2;

// public：访问修饰符，表示这个类可以被任何地方访问
// class：关键字，用于定义一个类
// Test：类名，这是一个测试类，用于演示抽象类的使用
public class Test { // 类的开始标记
    // public：访问修饰符，表示这个方法可以被任何地方访问
    // static：静态修饰符，表示这个方法属于类，不需要创建对象就可以调用
    // void：返回值类型，表示这个方法不返回任何数据
    // main：方法名，这是Java程序的入口点
    // String[] args：参数列表，表示命令行参数数组
    // main方法是Java程序的执行入口，JVM会自动调用这个方法
    public static void main(String[] args) { // main方法的开始标记
        // 这是一个注释行，解释了这段代码的目的
        // 目标：搞清楚使用抽象类的好处。
        
        // Animal a：声明一个Animal类型的变量a
        // new Dog()：创建一个Dog类的对象
        // Animal a = new Dog()：这是多态的体现，父类引用指向子类对象
        // 多态：同一个类型的变量，在不同情况下表现出不同的行为
        // 这里虽然a是Animal类型，但它实际指向的是Dog对象，所以调用a.cry()时会执行Dog类的cry()方法
        Animal a = new Dog();
        
        // a.cry()：调用a对象的cry()方法
        // 由于多态的存在，这里实际执行的是Dog类中重写的cry()方法
        // 这就是抽象类的好处之一：可以编写通用代码，处理不同的子类对象
        a.cry();
    } // main方法结束标记
} // Test类结束标记
